#include "common.h"
#include "test.h"

#include <iostream>
#include <iomanip>
#include <cmath>
#include <iomanip>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
#include "test.h"
#include "CString.h"

/* 双向循环列表
1.模版类，类名是List,创建模版目的：节点数据类型未知
2.建立节点结构体(一个前节点，一个后节点，一个未知类型数据)，节点构造函数(初始化)
3.增加list第一个节点(只有一个头节点，其data不能改)，链表头结点构造函数(初始化)
4.增加新节点函数
5.连线规则
6.将新节点按照规则加入列表(添加一个节点)
6.删除链表中的节点:先设置一个node类型指针指向头结点，用来遍历链表
*/
template<class T>//模版类
class CList
{
public:
    class node//节点类
    {
        public:
        node * pPre;
        node * pNext;
        T data;
    node()//节点初始化
    {
        pPre=NULL;
        pNext=NULL;
    }
    node(T data)//节点传参初始化
    {
        pPre=NULL;
        pNext=NULL;
        this->data=data;        
    }
    };
private:
    node head;//建立一个头节点
public:
    CList()
    {
        head.pPre=&head;
        head.pNext=&head;
    }
    void addnode(T data)//建立节点，插入列表
    {
        node * NewNode= new node(data);//创建一个新的节点并且赋值
        head.pPre->pNext=NewNode;
        NewNode->pPre=head.pPre;
        NewNode->pNext=&head;
        head.pPre=NewNode;
        //std::cout << NewNode->data << std::endl;//每次增加时打印一次
    }
    void delnode(int pos)
    {
        node * p=head.pNext;

        while(pos>0&&p!=&head)
        {
            pos--;
            p=p->pNext;
        }
        if(p=&head)
        {
            std::cout << "找到头了" << std::endl;
        }else
        {
            p->pPre->pNext=p->pNext;
            p->pNext->pPre=p->pPre;
            delete p;
        }

    }//void delnode(int pos)

    void print()
    {
        //遍历链表中所有node
        node * p = head.pNext;
        p=p->pNext;
        std::cout << NewNode->data << std::endl
    }
    
};


int main()
{
    CList<int> List1;//定义一个模版类整型
    List1.addnode(10);
    List1.addnode(20);
    List1.addnode(20);
    List1.addnode(20);
    List1.delnode(1);

    return 0;
}